로딩 중이에요... 🐣
[코담]
웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트
11 앱 만들기 (1부) | ✅ 편저: 코담 운영자
Django 튜토리얼 #11 - 앱 만들기 (1부)
🔗 소스
1. 강의 목표
- 인벤토리 관리 시스템을 만들며 Django의 전반적인 흐름을 정리
- 프로젝트 생성부터 앱 구성, 모델 정의, crispy-forms 연동까지 실습 진행
2. 디렉토리 구조 (최종 완성 기준)
FinalProject/
├── invProject/
│ ├── invApp/
│ │ ├── migrations/
│ │ ├── templates/invApp/
│ │ │ ├── home.html
│ │ │ ├── layout.html
│ │ │ ├── product_confirm_delete.html
│ │ │ ├── product_form.html
│ │ │ └── product_list.html
│ │ ├── admin.py
│ │ ├── apps.py
│ │ ├── forms.py
│ │ ├── models.py
│ │ ├── tests.py
│ │ ├── urls.py
│ │ └── views.py
│ ├── settings.py 외 config 파일들...
├── manage.py
└── Pipfile / Pipfile.lock
3. 프로젝트 생성 및 환경 설정
(1) 가상환경 활성화 및 Django 설치
pipenv shell
pipenv install django
(2) 추가 패키지 설치
pipenv install django-crispy-forms
pipenv install crispy-bootstrap5
(3) 프로젝트 및 앱 생성
django-admin startproject invProject
cd invProject
python manage.py startapp invApp
(4) settings.py 설정
- INSTALLED_APPS 항목에 다음 추가:
INSTALLED_APPS = [
...
'invApp',
'crispy_forms',
'crispy_bootstrap5',
]
CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5"
CRISPY_TEMPLATE_PACK = "bootstrap5"
4. 모델 정의 (invApp/models.py)
제품(Product) 정보를 담을 모델 정의. 각각의 필드에 대해 적절한 타입과 제약 조건 부여.
from django.db import models
class Product(models.Model):
product_id = models.AutoField(primary_key=True)
name = models.CharField(max_length=100)
sku = models.CharField(max_length=50, unique=True)
price = models.FloatField()
quantity = models.IntegerField()
supplier = models.CharField(max_length=100)
def __str__(self):
return self.name
AutoField(primary_key=True)
→ 자동 증가 IDsku
는 제품별 고유 코드 (unique=True)__str__()
메서드는 admin 페이지나 리스트에서 이름 출력
5. 마이그레이션 적용
python manage.py makemigrations
python manage.py migrate
- 모델 정의 후 반드시 마이그레이션 생성 및 DB 반영 필요
/migrations/0001_initial.py
에 생성된 필드 확인 가능
6. 폼 정의 (invApp/forms.py)
crispy-forms와 Bootstrap5 기반으로 구성된 제품 입력 폼 정의
from django import forms
from .models import Product
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = '__all__'
labels = {
'product_id': '상품 ID',
'name': '상품명',
'sku': 'SKU',
'price': '가격',
'quantity': '수량',
'supplier': '공급자',
}
widgets = {
'product_id': forms.NumberInput(
attrs={'placeholder':'예: 1', 'class':'form-control'}),
'name': forms.TextInput(
attrs={'placeholder':'예: 셔츠', 'class':'form-control'}),
'sku': forms.TextInput(
attrs={'placeholder':'예: S12345', 'class':'form-control'}),
'price': forms.NumberInput(
attrs={'placeholder':'예: 19.99', 'class':'form-control'}),
'quantity': forms.NumberInput(
attrs={'placeholder':'예: 10', 'class':'form-control'}),
'supplier': forms.TextInput(
attrs={'placeholder':'예: ABC 주식회사', 'class':'form-control'}),
}
widgets
를 활용해 각 필드별로 적절한 HTML input type과 placeholder 설정class: form-control
로 Bootstrap 스타일 적용
7. URL 연결 (invApp/urls.py)
제품 생성, 목록 조회, 수정, 삭제를 처리하는 URL 패턴을 구성합니다.
from django.urls import path
from . import views
urlpatterns = [
path('', views.home_view, name="home"),
path('create/', views.product_create_view, name="product_create"),
path('list/', views.product_list_view, name="product_list"),
path('update/<int:product_id>/', views.product_update_view, name="product_update"),
path('delete/<int:product_id>/', views.product_delete_view, name="product_delete"),
]
8. 실습 요약
- 모델, 폼, URL 설정까지 완료하면 이후 뷰 및 템플릿 연결만 하면 전체 제품 관리 기능(CRUD)을 구현할 수 있음
다음 강의 예고
- 12강에서는
views.py
,urls.py
, 템플릿 연결을 통해 CRUD 기능을 구성함